package com.haha.keymap.v4;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Modality;
import javafx.stage.Stage;
import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;

import java.io.IOException;
import java.net.URL;

/**
 * @author shenlinnan
 * @date 2025/7/20 13:47
 */
public class MainApp extends Application {

    /**
     * 配置窗口实例
     */
    private Stage configStage;
    private MainController mainController;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        // 加载主页面
        URL mainFxmlUrl = getClass().getResource("/main.fxml");
        if (mainFxmlUrl == null) {
            throw new RuntimeException("FXML 文件未找到，请检查路径: /main.fxml");
        }

        FXMLLoader loader = new FXMLLoader(mainFxmlUrl);
        Parent root = loader.load();

        // 获取控制器并设置配置数据
        mainController = loader.getController();
        //mainController.setSkillConfigData(CommonUtil.getConfigInfo());
        mainController.setPrimaryStage(primaryStage);
        // 设置主应用引用
        mainController.setMainApp(this);
        mainController.registerKeyListener();

        Scene scene = new Scene(root, 640, 400);
        primaryStage.setScene(scene);
        primaryStage.setTitle("键映射器");
        primaryStage.show();

        loadConfigStage();

        try {
            GlobalScreen.registerNativeHook();
            // 禁用JNativeHook日志
            java.util.logging.Logger.getLogger(GlobalScreen.class.getPackage().getName()).setLevel(java.util.logging.Level.OFF);
        } catch (NativeHookException ex) {
            ex.printStackTrace();
        }

        // 添加窗口关闭事件处理
        primaryStage.setOnCloseRequest(event -> {
            System.out.println("关闭...");
            // 执行清理操作
            cleanup();
            // 退出应用程序
            System.exit(0);
        });

    }

    private void loadConfigStage() throws IOException {
        // 加载配置页面
        URL configFxmlUrl = getClass().getResource("/config.fxml");
        if (configFxmlUrl == null) {
            throw new RuntimeException("FXML 文件未找到，请检查路径: /config.fxml");
        }
        FXMLLoader configLoader = new FXMLLoader(configFxmlUrl);
        Parent configParent = configLoader.load();

        // 创建配置窗口
        configStage = new Stage();
        // 模态窗口
        configStage.initModality(Modality.APPLICATION_MODAL);
        configStage.setTitle("配置向导");
        configStage.setScene(new Scene(configParent, 600, 400));
        configStage.setResizable(false);

        // 获取配置控制器并设置主应用引用
        ConfigController configController = configLoader.getController();
        configController.setMainApp(this);
        configController.setMainController(mainController);

        // 窗口显示时注册监听器
        configStage.setOnShown(e -> configController.registerKeyListener());

        // 窗口关闭时注销监听器
        configStage.setOnHidden(event -> {
            configController.unregisterKeyListener();
            configController.reset();
        });
    }

    public void showConfigDialog() {
        if (configStage != null) {
            configStage.show();
        } else {
            System.out.println("没找到配置页面");
        }
    }

    /**
     * 隐藏配置窗口
     */
    public void hideConfigDialog() {
        if (configStage != null) {
            configStage.hide();
        }
    }

    private void cleanup() {
        try {
            // 注销全局键盘监听
            GlobalScreen.unregisterNativeHook();
            System.out.println("全局键盘监听已注销");
        } catch (NativeHookException ex) {
            ex.printStackTrace();
        }

        // 注销主控制器的键盘监听
        if (mainController != null) {
            mainController.unregisterKeyListener();
        }

        // 关闭配置窗口（如果打开）
        if (configStage != null && configStage.isShowing()) {
            configStage.close();
        }
    }

}
